package br.edu.ufam.controleAcesso

class GrupoController {
    
    def index = { redirect(action:list,params:params) }

    // the delete, save and update actions only accept POST requests
    def static allowedMethods = [delete:'POST', save:'POST', update:'POST']

    def list = {
        
    }

    def show = {
        def grupo = Grupo.get( params.id )
        def grupoAplicacao = Aplicacao.executeQuery("select g.aplicacao from GrupoAplicacao g where g.grupo.id = ? order by g.aplicacao.menu.descricao, g.aplicacao.descricao",[grupo.id])

        if(!grupo) {
            flash.message = "Registro não encontrado!"
            redirect(action:list)
        }
        else { return [ grupo : grupo, grupo_apli : grupoAplicacao ] }
    }

    def delete = {
        def grupo = Grupo.get( params.id )
        grupo.usuarioUpdated = null
        grupo.usuarioCreated = null
        if (grupo){
            def grupoAplicacao = GrupoAplicacao.findAll("from GrupoAplicacao g where g.grupo.id = ?", [grupo.id])
	        def grupoUsuario = Grupo.executeQuery("select count(distinct u) from Usuario u where u.grupo.id = ?",[grupo.id])
	        if (grupoUsuario[0] == 0){
	            Grupo.withTransaction{status ->
                    grupoAplicacao.each{
                        it.delete(flush:true)
                    }
                    try{
                        grupo.delete(flush:true)                        
                        flash.message = "Operação realizada com sucesso!"
                    }catch(e){
                        flash.errors = "Operação não realizada! - " + e.toString()
                    }
                    redirect(action:list)
                }
	        }else{
	  	        flash.errors = "Operação não realizada! - " + "O grupo possui usuário(s)."
		        redirect(action:list)
	        }
        }else {
            flash.message = "Registro não encontrado!"
            redirect(action:list)
        }
    }

    def edit = {
        def grupo = Grupo.get(params.id)
        def grupo_apli = Aplicacao.executeQuery("select g.aplicacao from GrupoAplicacao g where g.grupo.id = ? order by g.aplicacao.menu.descricao, g.aplicacao.descricao",[grupo.id])
        def aplicacoes = Aplicacao.findAll("from Aplicacao a order by a.menu.descricao, a.descricao") - grupo_apli

        if(!grupo) {
            flash.message = "Registro não encontrado!"
            redirect(action:list)
        }
        else {
            return [ grupo : grupo, grupo_apli : grupo_apli, aplicacoes : aplicacoes ]
        }
    }

    def update = {
        def grupo = Grupo.get( params.id )        
        def aplicacao = null
        if (params.lista2.getClass() == (new String()).getClass()){
            params.lista2 = [params.lista2]
        }
        if(grupo)
        {
            grupo.properties = params
            grupo.usuarioUpdated = Usuario.get(session.usuario)
            grupo.descricao = TratarStringUpperCodec.encode(grupo.descricao)
            def grupoAplicacao = GrupoAplicacao.executeQuery("select g from GrupoAplicacao g where g.grupo.id = ?",[grupo.id])
            Grupo.withTransaction{status ->
                grupoAplicacao.each{
                    it.delete(flush:true)
                }
                params.lista2.each {
                    aplicacao = Aplicacao.get(String.valueOf(it.value))
                    grupoAplicacao = new GrupoAplicacao()
                    grupoAplicacao.aplicacao = aplicacao
                    grupoAplicacao.grupo = grupo
                    grupoAplicacao.save(flush:true)
                }
                if(!status.isRollbackOnly() && !grupo.hasErrors() && grupo.save(flush:true)) {
                    flash.message = "Operação realizada com sucesso!"
                    redirect(action:show,id:grupo.id)
                }
                else {                    
                    render(view:'edit',model:[grupo:grupo])
                }
            }
        }
        else {
            flash.message = "Registro não encontrado!"
            redirect(action:edit,id:params.id)
        }
    }

    def create = {
        def grupo = new Grupo()
        grupo.properties = params
        return ['grupo':grupo]
    }

    def save = {
        def grupo = new Grupo(params)
        grupo.usuarioUpdated = Usuario.get(session.usuario)
        grupo.usuarioCreated = Usuario.get(session.usuario)
        grupo.descricao = TratarStringUpperCodec.encode(grupo.descricao)
        if (params.lista2.getClass() == (new String()).getClass()){
            params.lista2 = [params.lista2]
        }
        Grupo.withTransaction{status ->
            grupo.save(flush:true)
            params.lista2.each {
                def aplicacao = Aplicacao.get(it)
                def grupoAplicacao = new GrupoAplicacao()
                grupoAplicacao.aplicacao = aplicacao
                grupoAplicacao.grupo = grupo
                grupoAplicacao.save(flush:true)
            }
            if(!status.isRollbackOnly() && !grupo.hasErrors() && grupo.save(flush:true)) {
                flash.message = "Operação realizada com sucesso!"
                redirect(action:show,id:grupo.id)
            }
            else {
                render(view:'create',model:[grupo:grupo])
            }
        }
    }

    def dosearch = {
        if (!params.max) {
            params.max = 10
            params.offset = 0
        }
        def grupos = Grupo.findAll("from Grupo where upper(descricao) like upper(?) order by descricao", ["%"+params.descricao+"%"], [max:params.max, offset:params.offset])
        int qtd = Grupo.countByDescricaoIlike("%${params.descricao}%")
        return [grupos: grupos, qtd: qtd]
    }
}
